{
 "metadata": {
  "name": "Projection_Ex"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "As before, we can easily extend this projection operator to cases where the measure of distance between $\\mathbf{y}$ and the subspace $\\mathbf{v}$ is weighted (i.e. non-uniform). We can accomodate these weighted distances by re-writing the projection operator as\n",
      "\n",
      "$$ \\mathbf{P}_{V} = \\mathbf{V} ( \\mathbf{V}^T \\mathbf{Q V})^{-1} \\mathbf{V}^T \\mathbf{Q} $$\n",
      "\n",
      "where $\\mathbf{Q}$ is positive definite matrix.  Earlier, we started with a point $\\mathbf{y}$ and inflated a sphere  centered at $\\mathbf{y}$ until it just touched the plane defined by $\\mathbf{v}_i$ and this point was closest point on the subspace to $\\mathbf{y}$. In the general case with a weighted distance except now we inflate an ellipsoid, not a sphere, until the ellipsoid touches the line.\n",
      "\n",
      "The code and figure below illustrate what happens using the weighted $ \\mathbf{P}_v $. It is basically the same code we used above. You can download the IPython notebook corresponding to this post and try different values on the diagonal of $\\mathbf{Q}$."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "x = np.linspace(0,2,50)\n",
      "y = x + x**2 + np.random.randn(len(x))\n",
      "\n",
      "V = matrix(np.vstack([ones(x.shape),x,x**2]).T)\n",
      "Q = np.matrix(np.eye(V.shape[0]))\n",
      "i,j =np.diag_indices_from(Q)\n",
      "Q[i[:20],j[:20]]=100\n",
      "R = np.matrix(np.diag([1,1,13]))*0\n",
      "\n",
      "Pv = V*inv(V.T*Q*V+R)*V.T*Q\n",
      "\n",
      "p=np.polyfit(x,y,2)\n",
      "\n",
      "fig, ax = subplots()\n",
      "fig.set_size_inches(5,5)\n",
      "\n",
      "ax.plot(x,y,'o',label='data',alpha=0.3)\n",
      "ax.plot(x,np.dot(Pv,y).flat,label='projection')\n",
      "ax.plot(x,np.polyval(p,x),'-',label='polyfit',alpha=0.3)\n",
      "ax.grid()\n",
      "ax.legend(loc=0)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 69,
       "text": [
        "<matplotlib.legend.Legend at 0x62cb3f0>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x5f003d0>"
       ]
      }
     ],
     "prompt_number": 69
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "x = np.random.rand(50)*2\n",
      "x.sort() # sort for plotting\n",
      "       \n",
      "y = x + x**2 + np.random.randn(len(x))\n",
      "\n",
      "V = matrix(np.vstack([ones(x.shape),x,x**2]).T)\n",
      "Pv = V*inv(V.T*V+eye(3)*4)*V.T\n",
      "\n",
      "p=np.polyfit(x,y,2)\n",
      "\n",
      "fig, ax = subplots()\n",
      "fig.set_size_inches(5,5)\n",
      "\n",
      "ax.plot(x,y,'o',label='data',alpha=0.3)\n",
      "ax.plot(x,np.dot(Pv,y).flat,'-s',label='projection')\n",
      "#ax.plot(x,np.polyval(p,x),'s',label='polyfit')\n",
      "ax.grid()\n",
      "ax.legend(loc=0);"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "display_data",
       "png": "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\nPsiaGrEAAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0x3c2fe10>"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import matplotlib.pyplot as plt\n",
      "from matplotlib.widgets import Slider \n",
      "\n",
      "fig, ax = plt.subplots()\n",
      "fig.set_size_inches(5,5)\n",
      "\n",
      "plt.subplots_adjust(left=0.25, bottom=0.30,right=1)\n",
      "\n",
      "x = np.linspace(0,2,50)\n",
      "y = x + x**2 + np.sin(2*np.pi*x) + np.random.randn(len(x))\n",
      "\n",
      "V = np.matrix(np.vstack([np.ones(x.shape),x,x**2]).T)\n",
      "Q = np.matrix(np.eye(V.shape[0]))\n",
      "i,j =np.diag_indices_from(Q)\n",
      "#Q[i[:20],j[:20]]=100\n",
      "R = np.matrix(np.diag([1,1,1]))*0\n",
      "\n",
      "Pv = V*np.linalg.inv(V.T*Q*V+R)*V.T*Q\n",
      "p=np.polyfit(x,y,2)\n",
      "\n",
      "ax.plot(x,y,'o',label='data',alpha=0.3)\n",
      "ax.set_title('err^2=%3.2f'%(np.linalg.norm(y)**2 - np.linalg.norm(np.dot(Pv,y))**2 ))\n",
      "ls_line,=ax.plot(x,np.dot(Pv,y).flat,label='projection')\n",
      "ax.plot(x,np.polyval(p,x),'-',label='polyfit',alpha=0.3)\n",
      "ax.legend(loc=0)\n",
      "ax.grid()\n",
      "\n",
      "axw0 = plt.axes([0.25, 0.2, 0.65, 0.03] )\n",
      "sw0  = Slider(axw0, 'w0', 0.1, 30.0, valinit = 1)\n",
      "axw1 = plt.axes([0.25, 0.15, 0.65, 0.03] )\n",
      "sw1  = Slider(axw1, 'w1', 0.1, 30.0, valinit = 1)\n",
      "axw2 = plt.axes([0.25, 0.10, 0.65, 0.03] )\n",
      "sw2  = Slider(axw2, 'w2', 0.1, 30.0, valinit = 1)\n",
      "\n",
      "def update_w0(val):\n",
      "   w = sw0.val\n",
      "   R[0,0]=w\n",
      "   Pv = V*np.linalg.inv(V.T*Q*V+R)*V.T*Q\n",
      "   ls_line.set_ydata(np.dot(Pv,y).flat)\n",
      "   ax.set_title('err=%3.2f'%(np.linalg.norm(y)**2 - np.linalg.norm(np.dot(Pv,y))**2 ))\n",
      "   plt.draw()\n",
      "sw0.on_changed(update_w0)\n",
      "\n",
      "def update_w1(val):\n",
      "   w = sw1.val\n",
      "   R[1,1]=w\n",
      "   Pv = V*np.linalg.inv(V.T*Q*V+R)*V.T*Q\n",
      "   ls_line.set_ydata(np.dot(Pv,y).flat)\n",
      "   ax.set_title('err=%3.2f'%(np.linalg.norm(y)**2 - np.linalg.norm(np.dot(Pv,y))**2 ))\n",
      "   plt.draw()\n",
      "sw1.on_changed(update_w1)\n",
      "\n",
      "def update_w2(val):\n",
      "   w = sw2.val\n",
      "   R[2,2]=w\n",
      "   Pv = V*np.linalg.inv(V.T*Q*V+R)*V.T*Q\n",
      "   ls_line.set_ydata(np.dot(Pv,y).flat)\n",
      "   ax.set_title('err=%3.2f'%(np.linalg.norm(y)**2 - np.linalg.norm(np.dot(Pv,y))**2 ))\n",
      "   plt.draw()\n",
      "sw2.on_changed(update_w2)\n",
      "\n",
      "plt.show()\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x69af910>"
       ]
      }
     ],
     "prompt_number": 77
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "References"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This post was created using the [nbconvert](https://github.com/ipython/nbconvert) utility from the source [IPython Notebook](www.ipython.org) which is available for [download](https://github.com/unpingco/Python-for-Signal-Processing/blob/master/Projection_mdim.ipynb) from the main github [site](https://github.com/unpingco/Python-for-Signal-Processing) for this blog. The projection concept is masterfully discussed in the classic Strang, G. (2003). *Introduction to linear algebra*. Wellesley Cambridge Pr. Also, some of Dr. Strang's excellent lectures are available on [MIT Courseware](http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/). I highly recommend these as well as the book."
     ]
    }
   ],
   "metadata": {}
  }
 ]
}